package simular;

import java.util.ArrayList;

import util.Arquivo;
import configs.Configuracao;
import base.PSO;

public class Simulador {
	
	static String saidaMedia = "ConvergenciaMedia_"+Configuracao.funcao.getNome()
			+"";
	static String boxplot = "Boxplot_"+Configuracao.funcao.getNome()
			+"";
	static int amostras = 30;
	static ArrayList<Double> media;
	static ArrayList<Double> melhorPorAmostra;
	
	public static void main(String[] args) {

		System.out.println("Iniciando simulador");

		media = init(configs.Configuracao.ITERACOES);
		melhorPorAmostra = init(amostras);
		
		PSO pso;
		for(int i = 0; i< amostras; i++)
		{
			pso = new PSO(Configuracao.funcao);
			pso.run();
			
			somarAmostra(pso.historicoConvergencia);
			System.out.println("Amostra " + (i+1)+ " finalizada.");
			
			double convergencia = pso.historicoConvergencia.get(pso.historicoConvergencia.size() -1);
			melhorPorAmostra.set(i, convergencia);
		}
		
		calcularMedia();
		finalizar();
	}
	
	public static void somarAmostra(ArrayList<Double> amostra)
	{
		for(int i = 0; i < amostra.size(); i++)
		{
			media.set(i, media.get(i) + amostra.get(i));
		}
	}
	
	public static void calcularMedia()
	{
		for(int i = 0; i < media.size(); i++)
		{
			media.set(i, (media.get(i)/amostras));
		}
	}

	public static ArrayList<Double> init(int tam)
	{
		ArrayList<Double> resp = new ArrayList<Double>();
		
		for(int i = 0; i < tam; i++)
		{
			resp.add(new Double(0));
		}
		
		return resp;
	}
	
	public static void finalizar()
	{
		Arquivo a = new Arquivo(saidaMedia);
		a.Escrita();
		a.escrever(media, 250);
		a.close();
		
		Arquivo b = new Arquivo(boxplot);
		b.Escrita();
		b.escrever(melhorPorAmostra, 1);
		b.close();
	}

}
